/**
 * 
 */
package edu.erpan.web.administracion;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletRequest;

import org.icefaces.ace.component.menuitem.MenuItem;

import edu.erpan.bl.entities.administracion.Rol;
import edu.erpan.bl.entities.administracion.Usuario;
import edu.erpan.fachada.administracion.IUsuarioFachada;
import edu.erpan.fachada.administracion.UsuarioFachada;
import edu.erpan.util.entityManager.exceptions.QueryException;
import edu.erpan.web.util.Recursos;

/**
 * @author Jeison
 *
 */
public class AdministracionSesionBean implements Serializable {

	/**
	 * @author Jeison
	 * @date 12/06/2013
	 */
	private static final long serialVersionUID = -6696139499026350048L;
	private Usuario usuario;
	private List<Rol>roles;
	
	private boolean existeUsuario=false;
	private boolean sesionIniciada=false;
	
	private List<SelectItem>itemsRoles;
	private List<MenuItem>itemsMenu;
	private Integer idRol;
	/**
	 * 
	 */
	public AdministracionSesionBean() {
		// TODO Auto-generated constructor stub
		this.usuario=new Usuario();
		
		verificarSesionIniciada();
	}
	
	@SuppressWarnings("unchecked")
	public void verificarSesionIniciada(){
		FacesContext context=FacesContext.getCurrentInstance();
		Usuario usuario=(Usuario) context.getExternalContext().getSessionMap().get("usuario");
		List<Rol> idRol=(List<Rol>) context.getExternalContext().getSessionMap().get("idRol");
		
		
		if(usuario==null||idRol==null){
			context.getExternalContext().getSessionMap().remove("menuBean");
		}else{
			try {
				if(!context.getExternalContext().isResponseCommitted()){
					HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
			        String path=request.getContextPath();
					context.getExternalContext().redirect(path+"/menu.iface");
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_INESPERADO);
				Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje);
			}
		}
		
	}
	
	public void consultarUsuario(ActionEvent evento){
		IUsuarioFachada usuarioFachada=new UsuarioFachada();
		try {
			usuario=usuarioFachada.consultarUsuario(usuario.getLogin(), usuario.getPassword());
		
			if(usuario==null){
				usuario=new Usuario();
			}
			
			existeUsuario=false;
			sesionIniciada=false;
			FacesContext context=FacesContext.getCurrentInstance();
			itemsRoles=new ArrayList<SelectItem>(0);
			roles=new ArrayList<Rol>(0);
			
			if(usuario.getIdusuario()!=null){
				if(this.usuario.getPersona()!=null){
					if(!this.usuario.isActivo()||!this.usuario.getPersona().isActivo()){
						String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_USUARIO_INACTIVO);
						Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje);
						return;
					}
				}
				
				roles=usuarioFachada.consultarRolesUsuario(usuario);
				if(isHayRoles()){
					existeUsuario=true;
					
					
					context.getExternalContext().getSessionMap().put("usuario", this.usuario);
					
					for(Rol rol:roles){
						SelectItem item=new SelectItem(rol.getIdrol(),rol.getNombre());
						itemsRoles.add(item);
					}
					this.idRol=this.roles.get(0).getIdrol();
					confirmarIngreso(evento);
				}else{
					String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_USUARIO_SIN_PERMISOS);
					Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje);
				}
			}else{
				context.getExternalContext().getSessionMap().remove("usuario");
			}
		} catch (QueryException e) {
			// TODO Auto-generated catch block
			String nombreEntidad=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_USUARIO);
			String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_CONSULTA);
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje.replace("{0}", nombreEntidad));
		}
	}
	
	public void confirmarIngreso(ActionEvent evento) {
		try{
			
			FacesContext context=FacesContext.getCurrentInstance();
			
			if(isHayRoles()){
				itemsMenu=new ArrayList<MenuItem>(0);
				sesionIniciada=true;
				
				context.getExternalContext().getSessionMap().put("idRol", this.roles);
				HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();
		        String path=request.getContextPath();
				context.getExternalContext().redirect(path+"/menu.iface");
			}else{
				String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_USUARIO_SIN_PERMISOS);
				Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje);
			}
		}catch (Exception e) {
			// TODO: handle exception
			String mensaje=Recursos.getInstance().getMensaje(Recursos.MENSAJE_ERROR_INESPERADO);
			Recursos.getInstance().addMessagePage(Recursos.getInstance().getMensaje(Recursos.ID_MENSAJES),Recursos.ERROR, mensaje);
		}
	}
	
	public void cancelarIngreso(ActionEvent evento){
		this.usuario=new Usuario();
		this.existeUsuario=false;
		this.roles=new ArrayList<Rol>();
	}
	
	
	/*public void llenarMenu(Modulo moduloPadre,UIComponent itemPadre, HashMap<Integer, UIComponent> posicionModulo){
		
		for(Modulo moduloHijo:moduloPadre.getModulos()){
				UIComponent itemHijo=null;
				if(moduloHijo.getModulos()==null||moduloHijo.getModulos().isEmpty()){
					itemHijo=new MenuItem();
					((MenuItem)itemHijo).setValue(moduloHijo.getNombre());
				}else{
					itemHijo=new Submenu();
					((Submenu)itemHijo).setLabel(moduloHijo.getNombre());
					((Submenu)itemHijo).setIcon("ui-icon ui-icon-contact");
				}
				
				itemPadre.getChildren().add(itemHijo);
				
				llenarMenu(moduloHijo, itemHijo,posicionModulo);
		}
	}*/
	
	public Usuario getUsuario() {
		return usuario;
	}
	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public List<Rol> getRoles() {
		return roles;
	}

	public void setRoles(List<Rol> roles) {
		this.roles = roles;
	}
	
	public boolean isHayRoles(){
		return roles!=null && !roles.isEmpty();
	}

	public List<SelectItem> getItemsRoles() {
		return itemsRoles;
	}

	public void setItemsRoles(List<SelectItem> itemsRoles) {
		this.itemsRoles = itemsRoles;
	}

	public Integer getIdRol() {
		return idRol;
	}

	public void setIdRol(Integer idRol) {
		this.idRol = idRol;
	}

	public boolean isExisteUsuario() {
		return existeUsuario;
	}

	public void setExisteUsuario(boolean existeUsuario) {
		this.existeUsuario = existeUsuario;
	}

	public List<MenuItem> getItemsMenu() {
		return itemsMenu;
	}

	public void setItemsMenu(List<MenuItem> itemsMenu) {
		this.itemsMenu = itemsMenu;
	}

	/**
	 * @return the sesionIniciada
	 *
	 * @author Jeison
	 * @date 16/09/2012
	 */
	public boolean isSesionIniciada() {
		verificarSesionIniciada();
		return sesionIniciada;
	}

	/**
	 * @param sesionIniciada the sesionIniciada to set
	 * 
	 * @author Jeison
	 * @date 16/09/2012
	 */
	public void setSesionIniciada(boolean sesionIniciada) {
		this.sesionIniciada = sesionIniciada;
	}

}
